﻿#include <opencv2/opencv.hpp>
#include <opencv2/photo.hpp>  // 包含 stylization 函数
#include <iostream>

int main() {
    // 读取原始图像
    cv::Mat src = cv::imread("H:\\DWORKPLACE\\CWork\\opencv\\testimages\\myfacedemo2.png");  // 替换为你的图像路径
    if (src.empty()) {
        std::cerr << "无法读取图像文件！请检查路径。" << std::endl;
        return -1;
    }
    if (src.type() != CV_8UC3) {
        std::cout << "输入图像类型为: " << src.type() << "，尝试转换为 CV_8UC3..." << std::endl;

        if (src.channels() == 1) {
            cv::cvtColor(src, src, cv::COLOR_GRAY2BGR);
            std::cout << "已从灰度图转换为 BGR 彩色图。" << std::endl;
        } else if (src.depth() != CV_8U) {
            cv::Mat temp;
            src.convertTo(temp, CV_8U, 255.0);  // 若是 float 类型
            cv::cvtColor(temp, src, cv::COLOR_GRAY2BGR);
            std::cout << "已从浮点图转换为 8-bit 彩色图。" << std::endl;
        } else {
            std::cerr << "无法转换为 CV_8UC3，图像格式不支持。" << std::endl;
            return -1;
        }
    }

    // 缩小图片
    while (src.cols > 5000 || src.rows > 5000){
        cv::resize(src, src, cv::Size(src.cols / 2, src.rows / 2));
    }

    // 进行非真实感渲染处理（如水彩画风格）
    cv::Mat stylizedImage;
    cv::stylization(src, stylizedImage);
    /*
     * void cv::stylization(InputArray src, OutputArray dst, float sigma_s = 60, float sigma_r = 0.45f);
     * 参数说明：
    1. src
        输入图像（必须是 CV_8UC3 格式的彩色图像）。
    2. dst
        输出图像，风格化后的图像。
    3. sigma_s（默认值：60）
        控制空间滤波器的大小（类似于半径）。
        值越大，风格越夸张，细节越少，边缘更软。
        推荐范围：0 ~ 200。
    4. sigma_r（默认值：0.45）
        控制颜色空间的滤波强度（对比度保持）。
        值越小，细节保留越多；值越大，色彩更柔和模糊。
        推荐范围：0 ~ 1.0。
     * */

    cv::Mat gray_sketch, color_sketch;
    cv::pencilSketch(src, gray_sketch, color_sketch, 10, 0.1, 0.02);
    // 将输入图像转换为 灰度铅笔素描 和 彩色铅笔素描 风格图像。
    // 参数说明：
    // src：输入图像（BGR彩色）。
    // dst1：输出灰度素描图像。
    // dst2：输出彩色素描图像。
    // sigma_s：控制空间滤波器大小，范围 0~200，值越大，画风越“粗犷”。
    // sigma_r：控制颜色敏感度，范围 0~1，越小细节越保留。
    // shade_factor：控制素描的阴影强度，建议值在 0.01~0.1。
    // 显示原图和风格化后的图像


    cv::Mat filtered;// 对图像进行平滑处理，保留边缘细节，常用于卡通化或去噪保边缘。
    cv::edgePreservingFilter(src, filtered, cv::RECURS_FILTER, 100, 0.5);

    cv::Mat enhanced;// 增强图像中的细节纹理，特别适合毛发、织物等纤维的表现。
    cv::detailEnhance(src, enhanced, 10, 0.15);



    cv::imshow("原始图像", src);
    cv::imshow("水彩画风格图像", stylizedImage);

    cv::imshow("Gray Sketch", gray_sketch);
    cv::imshow("Color Sketch", color_sketch);

    cv::imshow("Edge Preserved", filtered);

    cv::imshow("Detail Enhanced", enhanced);

    // 等待按键并退出
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

